/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortArray = function (nums) {
  let len = nums.length // 获得数组的长度
  let result = [] // 初始化结果数组
  let count = [] // 初始化计算数组
  let min = max = nums[0] // 初始化最大值为0的位置
  // 遍历数组查找最大值最小值 并记录每个值出现的次数
  for (let i = 0; i < len; i++) {
    count[nums[i]] = count[nums[i]] ? count[nums[i]] + 1 : 1 // 统计出现的此时 以下标代表值 值表示出现的次数 当不存在的时候赋值为1 存在的时候赋值为0
    max = max >= nums[i] ? max : nums[i] // 更新最大值
    min = min <= nums[i] ? min : nums[i] // 更新最小值
  }
  // 从最小值到最大值逐项增加 这个count[j] 表示j这个数字他的结束的下标+1
  for (let j = min; j <= max; j++) {
    count[j + 1] = (count[j + 1] || 0) + (count[j] || 0) // 最小的应该是0 假如最小的有m个 第二小的有n个 那么最小的结束的下标是m-1 第二小的结束的下小标就是n-1 
  }
  // count中下标为数组的值 数据为这个值出现的位置 反向填充到result数组中
  for (let k = len - 1; k >= 0; k--) {
    result[count[nums[k]] - 1] = nums[k] // 
    count[nums[k]]-- // 这个位置的应该--
  }
  // 遍历完成之后就完成了反向填充
  return result
};
// sortArray([5,2,3,-1,-10])
